package com.winsdom.mapper.customer;

import com.winsdom.entity.customer.CustomerPersonalUpdateRequest;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Map;

/**
 * 个人客户信息更新相关的数据访问接口，提供个人客户信息更新过程中涉及的各类数据操作。
 * 该接口包含了查询客户数据、更新客户主表、个人扩展信息、证件图片以及管理联系人等方法。
 */
@Repository
public interface CustomerPersonalUpdateMapper {
    /**
     * 根据客户ID查询个人客户完整数据
     * @param customerId 客户ID
     * @return 返回一个以customerId为键的Map，包含客户主表、个人扩展信息等数据
     */
    @MapKey("customerId")
    Map<String, Object> selectCustomerData(Long customerId);

    /**
     * 更新客户主表信息
     * @param request 个人客户更新请求对象，包含需要更新的客户主表字段
     */
    void updateCustomerMain(CustomerPersonalUpdateRequest request);

    /**
     * 更新个人扩展表信息
     * @param request 个人客户更新请求对象，包含需要更新的个人扩展表字段
     */
    void updatePersonalInfo(CustomerPersonalUpdateRequest request);

    /**
     * 强制更新证件图片信息（直接覆盖现有记录）
     * @param request 个人客户更新请求对象，包含新的证件图片路径
     */
    void forceUpdateIdImage(CustomerPersonalUpdateRequest request);

    /**
     * 删除指定客户的所有旧联系人信息（包括联系人-楼盘关联）
     * @param customerId 客户ID
     */
    void deleteOldContacts(Long customerId);

    /**
     * 插入新联系人信息
     * @param contact 联系人信息对象，包含联系人详细信息
     */
    void insertContact(@Param("contact") CustomerPersonalUpdateRequest.ContactInfo contact);

    /**
     * 插入联系人与楼盘分类的关联关系
     * @param contactId 联系人ID
     * @param categoryId 楼盘分类ID
     */
    void insertContactProperty(@Param("contactId") Long contactId, @Param("categoryId") Long categoryId);

    /**
     * 根据楼盘分类名称查询对应的分类ID
     * @param propertyName 楼盘分类名称
     * @return 对应的楼盘分类ID，如果不存在则返回null
     */
    Long selectCategoryIdByName(String propertyName);
}